#include "./bin-tree.h"
#include "../../stack/model/cir-queue.h"
#include <iostream>

using namespace std;

void createTree(BinTree &tree)
{
	cout << "输入二叉树的前序遍历以进行构造，用#表示这个节点为空，输入一次回车一次：" << endl;
	char dataChar;
	cin >> dataChar;
	if (dataChar == '#') //当遇到#时，令树的根节点为NULL，从而结束该分支的递归
	{
		tree = nullptr;
	}
	else
	{
		tree = new BTNode;
		tree->data = dataChar;
		createTree(tree->lchild);
		createTree(tree->rchild);
	}
}

void preOrderTraverse(BinTree &tree, void (*visit)(NodeDateType &e))
{
	if (tree != nullptr)
	{
		// 先访问根节点
		visit(tree->data);
		// 然后依次遍历左右子树
		preOrderTraverse(tree->lchild, visit);
		preOrderTraverse(tree->rchild, visit);
	}
}

void inOrderTraverse(BinTree &tree, void (*visit)(NodeDateType &e))
{
	if (tree != nullptr)
	{
		// 先遍历左子树
		inOrderTraverse(tree->lchild, visit);
		// 然后访问根节点
		visit(tree->data);
		// 然后遍历右子树
		inOrderTraverse(tree->rchild, visit);
	}
}

void postOrderTraverse(BinTree &tree, void (*visit)(NodeDateType &e))
{
	if (tree != nullptr)
	{
		// 先遍历左子树
		postOrderTraverse(tree->lchild, visit);
		// 然后遍历右子树
		postOrderTraverse(tree->rchild, visit);
		// 然后访问根节点
		visit(tree->data);
	}
}